/*
 * ScoreDAO.java
 *
 * Created on 24 februari 2008, 20:04
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package server.dataaccess;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
import data.Score;
import data.SpelScore;

/**
 *
 * @author Administrator
 */
public class ScoreDAO {

    private static Logger logger = Logger.getLogger(ScoreDAO.class);
    private static ResourceBundle bundle = ResourceBundle.getBundle("server.dataaccess.database");

    /** Creates a new instance of ScoreDAO */
    private ScoreDAO() {
    }

    public static Score getScoreById(int id) {
        String opdracht = "{call selectScoreById(?)}";
        Score score = null;

        try {
            Connection conn = Database.getInstance().getConnection();
            try {

                //Gebruiker updaten
                CallableStatement cstmt = conn.prepareCall(opdracht);
                cstmt.setInt(1, id);

                ResultSet rs = cstmt.executeQuery();
                if (rs.next()) {
                    score = new Score();
                    score.setId(rs.getInt(bundle.getString("score_id")));
                    score.setScrabbleGewonnen(rs.getInt(bundle.getString("score_sc_gewonnen")));
                    score.setScrabbleVerloren(rs.getInt(bundle.getString("score_sc_verloren")));
                    score.setScrabbleScore(rs.getInt(bundle.getString("score_sc_score")));
                    score.setBoggleGewonnen(rs.getInt(bundle.getString("score_st_gewonnen")));
                    score.setBoggleVerloren(rs.getInt(bundle.getString("score_st_verloren")));
                    score.setBoggleScore(rs.getInt(bundle.getString("score_st_score")));
                    score.setGalgjeGewonnen(rs.getInt(bundle.getString("score_ga_gewonnen")));
                    score.setGalgjeVerloren(rs.getInt(bundle.getString("score_ga_verloren")));
                    score.setGalgjeScore(rs.getInt(bundle.getString("score_ga_score")));
                }
                cstmt.close();

                logger.info("Score " + id + " opvragen gelukt!");

            } catch (SQLException ex) {
                logger.error("Fout bij het opvragen van een score!");
                logger.error(ex.getMessage());
            } finally {
                conn.close();
            }
        } catch (SQLException ex) {
            logger.error("Fout bij het openen of sluiten van de databaseconnectie tijdens het opvragen van een score!");
            logger.error(ex.getMessage());
        }


        return score;
    }

    public static SpelScore[] getTopscoreScrabble() {
        String opdracht = "{call selectTopscoreScrabble}";
        SpelScore[] scores = new SpelScore[10];
        try {
            Connection conn = Database.getInstance().getConnection();
            try {

                //Gebruiker updaten
                CallableStatement cstmt = conn.prepareCall(opdracht);

                ResultSet rs = cstmt.executeQuery();

                int i = 0;
                while (rs.next()) {
                    Score score = new Score();
                    SpelScore spelscore;
                    String nickname = rs.getString(bundle.getString("gebruiker_nickname"));
                    score.setScrabbleGewonnen(rs.getInt(bundle.getString("score_sc_gewonnen")));
                    score.setScrabbleVerloren(rs.getInt(bundle.getString("score_sc_verloren")));
                    score.setScrabbleScore(rs.getInt(bundle.getString("score_sc_score")));
                    scores[i] = new SpelScore(nickname, score,i+1);
                    i++;
                }
                cstmt.close();

                logger.info("topscores opvragen scrabble gelukt!");

            } catch (SQLException ex) {
                logger.error("Fout bij het opvragen van een topscore scrabble!");
                logger.error(ex.getMessage());
            } finally {
                conn.close();
            }
        } catch (SQLException ex) {
            logger.error("Fout bij het openen of sluiten van de databaseconnectie tijdens het opvragen van topscore scrabble!");
            logger.error(ex.getMessage());
        }


        return scores;
    }

    public static SpelScore[] getTopscoreBoggle() {
        String opdracht = "{call selectTopscoreBoggle}";
        SpelScore[] scores = new SpelScore[10];
        try {
            Connection conn = Database.getInstance().getConnection();
            try {

                //Gebruiker updaten
                CallableStatement cstmt = conn.prepareCall(opdracht);

                ResultSet rs = cstmt.executeQuery();

                int i = 0;
                while (rs.next()) {
                    Score score = new Score();
                    SpelScore spelscore;
                    String nickname = rs.getString(bundle.getString("gebruiker_nickname"));
                    score.setBoggleGewonnen(rs.getInt(bundle.getString("score_st_gewonnen")));
                    score.setBoggleVerloren(rs.getInt(bundle.getString("score_st_verloren")));
                    score.setBoggleScore(rs.getInt(bundle.getString("score_st_score")));
                    scores[i] = new SpelScore(nickname, score,i+1);
                    i++;
                }
                cstmt.close();

                logger.info("topscores opvragen Boggle gelukt!");

            } catch (SQLException ex) {
                logger.error("Fout bij het opvragen van een topscore Boggle!");
                logger.error(ex.getMessage());
            } finally {
                conn.close();
            }
        } catch (SQLException ex) {
            logger.error("Fout bij het openen of sluiten van de databaseconnectie tijdens het opvragen van topscore Boggle!");
            logger.error(ex.getMessage());
        }


        return scores;
    }

    public static SpelScore[] getTopscoreGalgje() {
        String opdracht = "{call selectTopscoreGalgje}";
        SpelScore[] scores = new SpelScore[10];
        try {
            Connection conn = Database.getInstance().getConnection();
            try {

                //Gebruiker updaten
                CallableStatement cstmt = conn.prepareCall(opdracht);

                ResultSet rs = cstmt.executeQuery();

                int i = 0;
                while (rs.next()) {
                    Score score = new Score();
                    SpelScore spelscore;
                    String nickname = rs.getString(bundle.getString("gebruiker_nickname"));
                    score.setGalgjeGewonnen(rs.getInt(bundle.getString("score_ga_gewonnen")));
                    score.setGalgjeVerloren(rs.getInt(bundle.getString("score_ga_verloren")));
                    score.setGalgjeScore(rs.getInt(bundle.getString("score_ga_score")));
                    scores[i] = new SpelScore(nickname, score,i+1);
                    i++;
                }
                cstmt.close();

                logger.info("topscores opvragen Galgje gelukt!");

            } catch (SQLException ex) {
                logger.error("Fout bij het opvragen van een topscore Galgje!");
                logger.error(ex.getMessage());
            } finally {
                conn.close();
            }
        } catch (SQLException ex) {
            logger.error("Fout bij het openen of sluiten van de databaseconnectie tijdens het opvragen van topscore Galgje!");
            logger.error(ex.getMessage());
        }


        return scores;
    }

    public static boolean updateScore(Score s) {
        String opdracht = "{call updateScore(?,?,?,?,?,?,?,?,?,?)}";
        boolean gelukt = false;

        try {
            Connection conn = Database.getInstance().getConnection();
            try {

                //Gebruiker updaten
                CallableStatement cstmt = conn.prepareCall(opdracht);
                cstmt.setInt(1, s.getGalgjeScore());
                cstmt.setInt(2, s.getGalgjeGewonnen());
                cstmt.setInt(3, s.getGalgjeVerloren());
                cstmt.setInt(4, s.getBoggleScore());
                cstmt.setInt(5, s.getBoggleGewonnen());
                cstmt.setInt(6, s.getBoggleVerloren());
                cstmt.setInt(7, s.getScrabbleScore());
                cstmt.setInt(8, s.getScrabbleGewonnen());
                cstmt.setInt(9, s.getScrabbleVerloren());
                cstmt.setInt(10, s.getId());

                cstmt.executeUpdate();
                cstmt.close();

                gelukt = true;

                logger.info("Score " + s.getId() + " updaten gelukt!");

            } catch (SQLException ex) {
                gelukt = false;
                logger.error("Fout bij het updaten van een score!");
                logger.error(ex.getMessage());
            } finally {
                conn.close();
            }
        } catch (SQLException ex) {
            logger.error("Fout bij het openen of sluiten van de databaseconnectie tijdens het updaten van een score!");
            logger.error(ex.getMessage());
        }


        return gelukt;
    }

    public static int voegScoreToe(Score s, Connection conn) {
        String opdracht = "{call insertScore(?,?,?,?,?,?,?,?,?,?)}";

        int newId = 0;

        try {
            CallableStatement cstmt = conn.prepareCall(opdracht);
            cstmt.setInt(1, s.getGalgjeScore());
            cstmt.setInt(2, s.getGalgjeGewonnen());
            cstmt.setInt(3, s.getGalgjeVerloren());
            cstmt.setInt(4, s.getBoggleScore());
            cstmt.setInt(5, s.getBoggleGewonnen());
            cstmt.setInt(6, s.getBoggleVerloren());
            cstmt.setInt(7, s.getScrabbleScore());
            cstmt.setInt(8, s.getScrabbleGewonnen());
            cstmt.setInt(9, s.getScrabbleVerloren());

            cstmt.registerOutParameter(10, Types.INTEGER);

            cstmt.executeUpdate();

            //Het pas gecreeerde ID voor dit record bijhouden zodat de gebruiker
            //bij wie dit score record hoort ernaar kan verwijzen
            newId = cstmt.getInt(10);
            cstmt.close();

            logger.info("Score toegevoegd met ID: " + newId);

        } catch (SQLException ex) {
            logger.error("Fout bij het toevoegen van een score!");
            logger.error(ex.getMessage());
        } finally {
        //Connectie terug sluiten is hier niet nodig aangezien deze methode
        //ENKEL opgeroepen mag worden in een transactie (zie GebruikerDAO)
        //Omdat je een transactie alleen kan rollbacken als de uitgevoerde operaties
        //tijdens eenzelfde connectie gebeuren, moet de connectie dus blijven openstaan en ze
        //bij de laatste operatie van de transactie terug sluiten!!

        /*try {
        Database.getInstance().getConnection().close();
        } catch (SQLException ex) {
        ex.printStackTrace();
        }*/
        }

        return newId;
    }
}
